MySQL에서 100GB 더미 데이터를 삽입하고, dump 파일을 Amazon S3로 전송해 보기
안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 MySQL에서 100GB dump 데이터를 만들어서 Amazon S3로 전송해 보는 방법을 정리해 봤습니다.
테이블 생성
mysql> CREATE TABLE large_table (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
random_data BLOB
);
BLOB 데이터 타입을 이용하여 큰 데이터를 삽입할 수 있도록 테스트용 테이블을 생성합니다.
데이터 삽입
mysql> DELIMITER //
CREATE PROCEDURE InsertLargeData()
BEGIN
DECLARE total_rows INT DEFAULT 1000000000; -- 원하는 총 레코드 수 (5,000,000)
DECLARE batch_size INT DEFAULT 100000; -- 한 번에 삽입할 행 수
WHILE total_rows > 0 DO
INSERT INTO large_table (random_data)
SELECT
REPEAT(CAST(FLOOR(RAND() * 10000) AS CHAR), 2048) -- 각 레코드는 약 2048 * 4 = 8192 bytes
FROM
(SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) AS t1,
(SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) AS t2,
(SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) AS t3
LIMIT batch_size;
SET total_rows = total_rows - batch_size;
-- 진행 상황을 출력
SELECT CONCAT('Inserted rows: ', batch_size, ', Remaining: ', total_rows);
END WHILE;
-- 추가적인 삽입이 필요하면 다시 호출 가능
END //
DELIMITER ;
대량의 데이터를 삽입할 수 있도록 저장 프로시저를 생성합니다.
mysql> CALL InsertLargeData();
+--------------------------------------------------------------------+
1 row in set (3 min 52.30 sec)
+--------------------------------------------------------------------+
| CONCAT('Inserted rows: ', batch_size, ', Remaining: ', total_rows) |
+--------------------------------------------------------------------+
| Inserted rows: 100000, Remaining: 634100000 |
+--------------------------------------------------------------------+
1 row in set (3 min 52.32 sec)
CALL 명령어로 저장 프로시저를 실행합니다. 저장 프로시저를 실행하면, 데이터가 삽입되며 약 10 - 15분간 진행됩니다. 처음에는 약 15-20GB의 데이터가 삽입되는데, 보다 더 많은 양의 데이터를 삽입하고 싶다면「total_rows」부분을 적절하게 변경하거나, 저장 프로시저를 몇 번더 반복합니다.
mysql> SELECT COUNT(*) FROM large_table;
+----------+
| COUNT(*) |
+----------+
| 1250000 |
+----------+
1 row in set (36.29 sec)
SELECT COUNT로 테이블에 삽입된 데아터 수를 확인할 수 있습니다.
mysql> ANALYZE TABLE large_table;
+--------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------------+---------+----------+----------+
| testdb.large_table | analyze | status | OK |
+--------------------+---------+----------+----------+
1 row in set (0.13 sec)
mysql> SELECT table_name AS "Table",
ROUND((data_length + index_length) / 1024 / 1024, 2) AS "Size (MB)"
FROM information_schema.tables
WHERE table_schema = "testdb";
+-------------+-----------+
| Table | Size (MB) |
+-------------+-----------+
| large_table | 18547.00 |
+-------------+-----------+
1 row in set (0.01 sec)
또한 상기 명령어로 테이블의 사이즈를 확인할 수 있습니다. 약 18GB가 삽입된 것을 확인할 수 있으며, 100GB가 될 때 까지 몇 번 반복합시다.
dump 파일 생성은 아래 블로그를 참고해 주세요.
EC2 인스턴스 권한 설정
이제 테이블에 100GB의 더미 데이터를 생성해 넣었다면, 이제 EC2 인스턴스에서 Amazon S3로 dump 파일을 전송하기 위한 권한을 설정합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket",
"s3:PutObject"
],
"Resource": [
"arn:aws:Amazon S3 ARN 입력",
"arn:aws:s3:::Amazon S3 ARN 입력/*"
]
},
{
"Action": [
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::*",
"Effect": "Allow"
}
]
}
dump 파일을 저장하고자 하는 Amazon S3의 ARN을 입력하고 권한을 생성하여 EC2 인스턴스에 할당합니다.
마지막으로 Amazon S3에는 test라는 이름의 폴더를 생성합니다.
현재 환경에 AWS CLI가 설치되어 있지 않다면, 아래 공식 문서를 참고하여 설치하도록 합시다. AWS CLI의 설치 여부는「aws --version」명령어로 확인할 수 있습니다.
Amazon S3로 dump 파일 전송
사전 준비가 모두 끝났다면 이제 Amazon S3로 dump 파일을 전송해 봅시다.
aws s3 cp /path/to/backup/db_backup.sql s3://S3 버킷 이름/test/
aws s3 cp 명령어를 사용하여 /path/to/backup/ 경로에 있는 db_backup.sql dump 파일을 Amazon S3의 test 폴더로 전송합니다.
이제 Amazon S3로 들어가 확인해 보면, dump 파일이 성공적으로 전송된 것을 확인할 수 있습니다.
본 블로그 게시글을 읽고 궁금한 사항이 있으신 분들은 [email protected]로 보내주시면 감사하겠습니다.